#include <iostream>
#include <queue>
using namespace std;

int num[1005];
queue<int> que;

bool dfs(int l, int r, bool flg) {
    // 参数l表示当前子数组的左边界，r表示右边界，flg表示当前是根大还是根小
    if (l > r)   // 递归边界，如果左边界大于右边界，说明子数组为空，返回true
        return true;

    int root = num[l];  // 取当前子数组的第一个元素作为根节点

    if (flg) {
        // 如果根大的情况
        for (int i = l + 1; i <= r; i++) {
            if (num[i] < root) {
                for (int j = i + 1; j <= r; j++) {
                    if (num[j] >= root) {
                        return false;  // 如果存在比根节点小的元素后面又出现比根节点大的元素，返回false
                    }
                }
                if (!dfs(l + 1, i - 1, flg)) // 递归判断左子树
                    return false;
                if (!dfs(i, r, flg))  // 递归判断右子树
                    return false;
                break;
            }
            if (i == r) {
                if (!dfs(l + 1, r, flg))
                    return false;
            }
        }
    }
    else {
        // 如果根小的情况
        for (int i = l + 1; i <= r; i++) {
            if (num[i] >= root) {
                for (int j = i + 1; j <= r; j++) {
                    if (num[j] < root) {
                        return false;  // 如果存在比根节点大的元素后面又出现比根节点小的元素，返回false
                    }
                }
                if (!dfs(l + 1, i - 1, flg)) // 递归判断左子树
                    return false;
                if (!dfs(i, r, flg)) // 递归判断右子树
                    return false;
                break;
            }
            if (i == r) {
                if (!dfs(l + 1, r, flg))
                    return false;
            }
        }
    }

    que.push(root); // 将根节点存入队列
    return true;
}

void print() {
    // 输出后序遍历结果
    cout << "YES" << endl;
    bool first = true;
    while (!que.empty()) {
        if (first)
            first = false;
        else
            cout << " ";
        int top = que.front();
        que.pop();
        cout << top;
    }
    cout << endl;
}

int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> num[i];

    if (dfs(1, n, 1)) {
        print();
        return 0;
    }
    else {
        while (!que.empty())
            que.pop();
    }

    if (dfs(1, n, 0)) {
        print();
    }
    else
        cout << "NO" << endl;

    return 0;
}